import {Where} from "@/lang/types";
import Layers from "@/lang/layers";
import Dictionary from "@/lang/dict/dictionary";
import {DictionaryQuery, PaginatedData} from "@/widget/types";

/**
 * 这是一份过时的设计，后续会逐渐淘汰掉这种写法
 */
export interface Setting {

    /**
     * 查询数据字典
     */
    queryDictionary: DictionaryQuery;

    /**
     * 全局气泡弹窗设置
     */
    popperOptions(): any;

    /**
     * 数据模糊搜索
     *
     * @param list - 数据列表
     * @param keyword -关键字
     * @returns 经过过滤，剩余的数据
     */
    search<T>(list: T[], keyword: string): T[];

    /**
     * 数据查询
     * @param opts 查询配置
     */
    ajax(opts: Where): Promise<Record<string, any>>;

    /**
     * 与 ajax 函数配套使用的数据格式化函数
     * @param arg 查询参数
     * @returns 经过格式化的分页数据
     */
    paginationParser(arg: any): PaginatedData;
}

/**
 * 如果需要调整系统默认的行为，直接覆盖当前类的函数即可
 */
const setting: Setting = {

    ajax: (opts) => {
        return Layers.ajax(opts);
    },

    popperOptions: () => {
        return {
            modifiers: [
                {
                    name: 'computeStyles',
                    options: {gpuAcceleration: false, adaptive: false},
                },
            ],
        }
    },

    search: (list, keyword) => {
        return Layers.search(list, keyword);
    },

    queryDictionary: (options) => {
        if (options == null) {
            // 返回一个空的数据字典
            return Promise.resolve(Dictionary.DEF);
        } else if (Array.isArray(options)) {
            // 将指定的数据列表，转换为数据字典
            return Promise.resolve(new Dictionary(options));
        } else if (typeof options === 'string') {
            // 使用数据字典的 key，从后台进行加载
            return Dictionary.query(options);
        } else {
            // 位置的数据格式
            throw 'Data-dictionary only accept array or string: ' + options;
        }
    },

    paginationParser: (arg) => {
        // 需要将后台数据打包成这种格式
        let ret = {list: [], total: 0};
        if (Array.isArray(arg)) {
            // 全量数据
            ret.list = arg;
            ret.total = arg.length;
        } else if (arg !== undefined) {
            // 分页数据
            ret.list = arg.list;
            ret.total = arg.total;
        }
        return ret;
    }
}

export default setting;

